#include <REGX52.H>

// 延时函数，ms 为延时毫秒数（适配 12MHz 晶振，可微调）
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 123; j++); 
    }
}

void main() {
    while (1) {
        // 1. 上边
        unsigned char i;
        for (i = 0; i < 8; i++) {
            P2 = ~(0x01 << i); // 低电平点亮，取反让对应位为 0
            P3 = 0x00;         // P3 口高电平点亮，全灭
            delay_ms(300);     // 控制流动速度
        }

        // 2. 右边
        for (i = 0; i < 8; i++) {
            P2 = 0xFF;         // P2 口全灭（高电平）
            P3 = 0x01 << i;    // 高电平点亮对应位
            delay_ms(300);
        }

        // 3. 下边
       for (i = 0; i < 8; i++) {
            P2 = ~(0x80 >> i); // 0x80 是 1000 0000，右移实现从右到左
            P3 = 0x00;         // P3 口全灭
            delay_ms(300);
        }

        // 4. 左边
        for (i = 0; i < 8; i++) {
            P2 = 0xFF;         // P2 口全灭
            P3 = 0x80 >> i;    // 0x80 右移，实现从下到上
            delay_ms(300);
        }
    }
}